package br.com.estevam.gallery.bancoimagens.visao;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.WindowConstants;


public class Visualizador extends JFrame {

	private static final long serialVersionUID = 5123278271734014920L;

	private JButton cancelar;
	private JLabel imagem;
	private JButton JButtonImportar;
	private JButton jButtonBuscar;
	private JPanel jPanelProcesso;
	private JPanel jPanel2;
	private JPanel jPanelMenu;
	private JScrollPane jScrollPane1;
	private JToolBar jToolBar1;
	private JProgressBar progresso;
	private JLabel status;
	
	public Visualizador() {
		initComponents();
		setSize(800,600);
		setLocationRelativeTo(null);
	}

	private ActionSupport actionSupport = new ActionSupport();
	
	public void addActionListener(ActionListener listener) {
		actionSupport.addActionListener(listener);
	}

	public void removeActionListener(ActionListener listener) {
		actionSupport.removeActionListener(listener);
	}

	private void initComponents() {
		jToolBar1 = new JToolBar();
		jPanelMenu = new JPanel();
		jPanel2 = new JPanel();
		jButtonBuscar = new JButton();
		JButtonImportar = new JButton();
		jPanelProcesso = new JPanel();
		progresso = new JProgressBar();
		cancelar = new JButton();
		status = new JLabel();
		jScrollPane1 = new JScrollPane();
		imagem = new JLabel();

		FormListener formListener = new FormListener();

		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setTitle("Visualizador de Imagens");
		setCursor(new java.awt.Cursor(Cursor.DEFAULT_CURSOR));
		addWindowListener(formListener);

		jPanelMenu.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

		jPanel2.setLayout(new GridLayout(1, 0, 5, 0));

		jButtonBuscar.setText("Buscar");
		jButtonBuscar.setActionCommand("buscar");
		jButtonBuscar.addActionListener(formListener);

		jPanel2.add(jButtonBuscar);

		JButtonImportar.setText("Importar");
		JButtonImportar.setActionCommand("importar");
		JButtonImportar.addActionListener(formListener);

		jPanel2.add(JButtonImportar);

		jPanelMenu.add(jPanel2);

		jToolBar1.add(jPanelMenu);

		getContentPane().add(jToolBar1, BorderLayout.NORTH);

		jPanelProcesso.setLayout(new FlowLayout(FlowLayout.CENTER));

		progresso.setEnabled(false);
		jPanelProcesso.add(progresso);

		cancelar.setForeground(Color.red);
		cancelar.setText("X");
		cancelar.setActionCommand("cancelar");
		cancelar.setEnabled(false);
		cancelar.addActionListener(formListener);

		jPanelProcesso.add(cancelar);

		status.setFont(new Font("Dialog", 0, 14));
		status.setText("Nenhuma imagem carregada");
		status.setEnabled(false);
		jPanelProcesso.add(status);

		getContentPane().add(jPanelProcesso, BorderLayout.SOUTH);

		jScrollPane1.setViewportView(imagem);

		getContentPane().add(jScrollPane1, BorderLayout.CENTER);

		pack();
	}

	private class FormListener implements ActionListener, WindowListener {
		public void actionPerformed(ActionEvent evt) {
			if (evt.getSource() == jButtonBuscar) {
				Visualizador.this.jButton3ActionPerformed(evt);
			}
			else if (evt.getSource() == JButtonImportar) {
				Visualizador.this.importarActionPerformed(evt);
			}
			else if (evt.getSource() == cancelar) {
				Visualizador.this.cancelarActionPerformed(evt);
			}
		}

		public void windowActivated(WindowEvent evt) {
		}

		public void windowClosed(WindowEvent evt) {
		}

		public void windowClosing(WindowEvent evt) {
			if (evt.getSource() == Visualizador.this) {
				Visualizador.this.formWindowClosing(evt);
			}
		}

		public void windowDeactivated(WindowEvent evt) {
		}

		public void windowDeiconified(WindowEvent evt) {
		}

		public void windowIconified(WindowEvent evt) {
		}

		public void windowOpened(WindowEvent evt) {
		}
	}

	private void formWindowClosing(WindowEvent evt) {
		actionSupport.fireActionEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "encerrar"));
	}

	private void jButton3ActionPerformed(ActionEvent evt) {
		actionSupport.fireActionEvent(evt);
	}

	private void cancelarActionPerformed(ActionEvent evt) {
		actionSupport.fireActionEvent(evt);
	}

	private void importarActionPerformed(ActionEvent evt) {
		actionSupport.fireActionEvent(evt);
	}

	public void ocupado(boolean ocupado) {
		EventQueue.invokeLater(new VisualizadorOcupado (this, ocupado));
	}

	class VisualizadorOcupado implements Runnable
	{
		private Visualizador visualizador;
		private boolean ocupado;

		public VisualizadorOcupado(Visualizador visualizador, boolean ocupado) {
			this.visualizador = visualizador;
			this.ocupado = ocupado;
		}

		public void run() {
			visualizador.JButtonImportar.setEnabled(!ocupado);
			visualizador.progresso.setEnabled(ocupado);
			visualizador.cancelar.setEnabled(ocupado);
			visualizador.status.setEnabled(ocupado);
			if (ocupado)
				visualizador.setCursor(new Cursor(Cursor.WAIT_CURSOR));
			else
				visualizador.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
		}
	}

	public void atualizaProgresso(int percentual, String msg) {
		EventQueue.invokeLater(new AtualizaProgresso (this, percentual, msg));
	}

	class AtualizaProgresso implements Runnable {
		@SuppressWarnings("unused")
		private Visualizador visualizador;
		private int percentual;
		private String msg;

		public AtualizaProgresso(Visualizador visualizador, int percentual, String msg) {
			this.visualizador = visualizador;
			this.percentual = percentual;
			this.msg = msg;
		}

		public void run() {
			if (percentual == 100) {
				progresso.setValue(percentual);
				status.setText("Imagem lida com sucesso.");
			}
			else if (percentual == -1) {
				status.setText("Leitura cancelada.");
				progresso.setValue(0);
			}
			else if (percentual == 0 && msg != null) {
				status.setText(msg);
				progresso.setValue(0);
			}
			else {
				progresso.setValue(percentual);
			}
		}

	}

	public void exibeImagem(Icon imagem) {
		EventQueue.invokeLater(new ExibeImagem(this, imagem));
	}

	private class ExibeImagem implements Runnable {
		private Visualizador visualizador;
		private Icon imagem;

		public ExibeImagem(Visualizador visualizador, Icon imagem) {
			this.visualizador = visualizador;
			this.imagem = imagem;
		}

		public void run() {
			visualizador.imagem.setIcon(imagem);
		}
	}
	
	public static void main(String args[]) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Visualizador().setVisible(true);
			}
		});
	}    

}


